#ifndef _IA_SEND_ADSBDATA_H_
#define _IA_SEND_ADSBDATA_H_

#include "../../../../General/selfDataType.h"
#include "../../../Receive/WithFPGA/iss_fpga2adsb_data.h"
#include "../../../../ADSB_RPTGEN/encodeReportStruct.h"

#pragma pack(1) //一字节对齐

//ADS-B OUT上报故障字
typedef struct
{
    //IO直接读取并赋值给MA51的故障字
    U32 MA51_ACAS_ADSB_OUT_FAULT_EICAS  : 1; //OneState="a BITE fault is detected that impacts ADS-B Out.检测到影响ADS-B Out功能的内置测试设备（BITE）故障。"
    U32 MA51_ACAS_ADSB_IN_SYSTEM_FAULT  : 1; //OneState="when ownship is not AIRB Qualified and the ADSB In OSS is Enabled.当本机（ownship）不具备AIRB（ADS-B In Required Airspace）运行资质，且ADS-B In OSS（Operational Service Status）功能被启用时"
    U32 MA51_ACAS_VSA_OWNSHIP_QUALIFIED : 1; //OneState="ownship meets VSA MOPS Quality 本机满足VSA MOPS质量"
    U32 MA51_ACAS_ADSB_IN_ENABLED_OSS   : 1; //OneState="The CISS OSS setting for enabling ADS-B In is sent to the ND function so it knows ADS-B is enabled." 用于激活 ADS-B In 功能的 CISS OSS 配置会传递给导航显示（ND）模块，使其能够识别并确认 ADS-B 功能已经启用。
                                             //“CISS OSS 配置”指的是集成式综合监视系统（CISS）中与操作支持相关的设置。//由IO来设置

    //内部故障字
    U32 ABNORMAL_INPUT_COMM_OF_TCAS     : 1; //TCAS输入通信异常
    U32 ABNORMAL_INPUT_COMM_OF_FPGA     : 1; //FPGA输入通信异常
    U32 ABNORMAL_INPUT_COMM_OF_IO       : 1; //IO输入通信异常

    U32 ICAO_Address_Fault              : 1; //ICAO地址故障
    U32 TMP_Mode_Control_Fault          : 1; //模式控制字丧失
    U32 Ownship_Hori_Position_Fault     : 1; //本机水平位置数据丧失
    U32 Ownship_Vert_Position_Fault     : 1; //本机垂直位置数据丧失
    U32 Ownship_Not_Qualified_for_AIRB  : 1; //本机数据质量不满足AIRB要求
    U32 ADSB_OUT_Type_0_Trigged         : 1; //ADS-B OUT广播TYPE 0事件被触发

    U32 Top_RF_TX_Channel_Fault         : 1; //顶部射频发射通道故障（4个全部故障）
    U32 Bot_RF_TX_Channel_Fault         : 1; //底部射频发射通道故障（4个全部故障）
    U32 Top_RF_RX_Channel_Fault         : 1; //顶部射频接收通道故障（4个全部故障）
    U32 Bot_RF_RX_Channel_Fault         : 1; //底部射频接收通道故障（4个全部故障）
    U32 Top_Ant_Impedance_Fault         : 1; //顶部天线阻抗检测故障（其中1个故障）
    U32 Bot_Ant_Impedance_Fault         : 1; //底部天线阻抗检测故障（其中1个故障）
    U32 Top_Self_TX_RX_Fault            : 1; //顶部自发自收自检故障（如果报故，且Top_RF_TX_Channel_Fault不报故，则证明顶部通道接收故障）
    U32 Bot_Self_TX_RX_Fault            : 1; //底部自发自收自检故障（如果报故，且Bot_RF_TX_Channel_Fault不报故，则证明底部通道接收故障）
    U32 Broadcast_Monitoring_Fault      : 1; //周期自检广播监控故障

    //预留
    U32 PAD                             :10; //预留
} ADSB_FAULT_WORD;

//OWNSHIP_STATUS_INFO大小为32字节
typedef struct
{
    U32 Sensitivity_Level_Control     : 8;          //TCAS工作模式, 0: STBY; 1: XPDR; 2: ALT OFF; 3: TA ONLY; 4: TARA; 5 = TCAS TEST; 6 = TCAS FAIL
    U32 ADSB_OUT_mode                 : 8;          //ADS-B OUT工作模式, 0: STBY/抑制/关闭; 1: NORMAL/正常; 2: TEST/测试;
    U32 ADSB_IN_mode                  : 8;          //ADS-B IN工作模式, 0: STBY/抑制/关闭; 1: NORMAL/正常; 2: TEST/测试;
    U32 Altitude_Select               : 3;          //高度带，0=NORMAL;2=BELOW;1=ABOVE;
    U32 Intruder_Altitude             : 3;          //高度类型，0=相对高度 REL;1=绝对高度 ABS;
    U32 PAd_1                         : 2;          //预留位

    ADSB_FAULT_WORD ADSB_Fault_Status;              //ADS-B上报故障状态, 每一位代表一种故障的状态，1= 故障存在

    //以下为显示模式，分别为ND FO、ND CAPT、HSI FO、HSI CAPT，目前的设计模式存在问题，4路独立输出是由IO来设置还是由ADS-B软件设置
    U32 ND_TFC_ADSB_Selection_Fo      : 3;          //显示模式 CodedSet="0=None; 1=All; 2=Declutter"
    U32 ND_TFC_ADSB_Selection_Capt    : 3;          //显示模式 CodedSet="0=None; 1=All; 2=Declutter"
    U32 HSI_TFC_ADSB_Selection_Fo     : 3;          //显示模式 CodedSet="0=None; 1=All"
    U32 HSI_TFC_ADSB_Selection_Capt   : 3;          //显示模式 CodedSet="0=None; 1=All"
    U32 pad_2                         :20;
    char sw_number[16];                            //软件件号, ADS-B固定为FSF34460005A；最后一位字符为版本号，该版本号根据代码版本变化，2025年6月27日为B
    U32 Pad_3[1];                                   //预留位
} OWNSHIP_STATUS_INFO;

00 01 01 01 | 01 01 01 00
04 00 00 00 | 00 00 00 04
00 00 00 00 | 00 00 00 00
46 53 46 33 | 33 46 53 46  3 F S F
34 34 36 30 | 30 36 34 34  0 6 4 4
30 30 35 41 | 41 35 30 30  A 5 0 0
42 00 00 00 | 00 00 00 42        B
00 00 00 00 | 00 00 00 00

//ASSAP综合输出
//ASSAP_OUTPUT_FILE_ELEMENT大小为112字节
typedef struct
{
    D64 bintime;                                    //Ownship/ADSB/TCAS,    时间，单位：s
    S32 num;                                        //Ownship/ADSB/TCAS,  暂时未用
    int target_unique_id;                           //航迹ID（考虑是否直接采用24位地址作为航迹ID，但对于仅TCAS交通，是否应该使用唯一内部ID，对于ASSAP综合输出，是否应该建议一个唯一ID）
    U32 type                :16;                    //Ownship/ADSB/TCAS,    目标类型, 0: 本机; 1：ADS-B; 2：TIS-B; 3：ADS-R; 4：仅 TCAS
    U32 tcas_alert_status   :16;                    //        ADSB/TCAS,    目标告警类型, 0: 无威胁的入侵机Other; 1: 接近的入侵机Proximate/Nearby; 2: 启动TA的入侵机TA; 4: 启动RA的入侵机RA
    /*
        Nearby Airborne Traffic - Airborne traffic that is within a 6 NM range and ±1200 ft altitude of ownship.
                                    See also TCAS Proximate Traffic.
        Nearby Ground Traffic – Ground traffic that is within a 1000 ft range of ownship.
    */

    char flight_id[8];                              //Ownship/ADSB/,        8字母航班号
    U32 emitter_cat         :16;                    //       /ADSB/,        发射机类别, 0：没有发射器类别信息
                                                    /*
                                                        1：轻型（<15500 磅）航空器
                                                        2：预留
                                                        3：小型（15500 至 75000 磅）航空器
                                                        4：预留
                                                        5：大型（75000 至 300000 磅）航空器
                                                        6：高涡流大型航空器（如 B-757 飞机）
                                                        7：重型（>300000 磅）航空器
                                                        8：高性能（大于 5g 加速度和大于 400 节）航空器
                                                        9：预留
                                                        10：旋翼机
                                                        11：滑翔机/高性能滑翔机
                                                        12：轻于空气的航空器
                                                        13：无人机
                                                        14：空间/跨大气层的飞行器
                                                        15：超轻式滑翔伞/滑翔伞
                                                        16：跳伞运动员/特技跳伞者
                                                        17：预留
                                                        18：预留
                                                        19：预留
                                                        20：地面车辆-应急车辆
                                                        21：地面车辆-服务车辆
                                                        22：点障碍物（包括气球）
                                                        23：群障碍物
                                                        24：线障碍物
                                                        25-31：预留
                                                    */

    U32 emergency_priority_status:15;               //       /ADSB/,        紧急/优先状态, 0：无紧急状态; 1：一般紧急状态; 2：救生员/医疗紧急状态; 3：最低限度燃料; 4：无通信; 5：非法干预; 6：飞机坠落; 7：预留
    U32 air_gnd_status           :1;                //Ownship/ADSB/,        空地状态, 1：空中; 0：地面

    S32 x;                                          //Ownship/ADSB/TCAS,    ENU坐标系x, 单位: meters
    S32 y;                                          //Ownship/ADSB/TCAS,    ENU坐标系x, 单位: meters
    S32 z;                                          //Ownship/ADSB/TCAS,    ENU坐标系x, 单位: meters
    D64 lat;                                        //Ownship/ADSB,         纬度, 单位: radians
    D64 lon;                                        //Ownship/ADSB,         经度, 单位: radians
    D64 alt;                                        //Ownship/ADSB/TCAS,    高度, 单位: meters
    S32 range;                                      //Ownship/ADSB/TCAS,    与本机相对距离, 单位: meters; 注：本数据可作为如下A664输出数据的源; 1、MA50 Intruder Range FLOAT; 2、MA64 距离 FLOAT
    F32 bearing;                                    //Ownship/ADSB/TCAS,    与本机相对方位, 单位: radians; 注：本数据可作为如下 A664 输出数据的源; 1、MA50 Bearing FLOAT; 2、MA64 相对方位 FLOAT
    F32 relative_alt;                               //Ownship/ADSB/TCAS,    与本机相对高度, 单位: meters; 直接取本机和它机的高度差值，与投影z有区别; 注：本数据可作为如下 A664 输出数据的源; 1、MA50 相对高度 FLOAT; 2、MA64 相对高度 FLOAT
    F32 ns_v;                                       //Ownship/ADSB,         东西速度, 单位: meters/second
    F32 ew_v;                                       //Ownship/ADSB,         南北速度, 单位: meters/second
    F32 track_hdg_trk;                              //Ownship/ADSB,         目标的真航迹角/真航向, 单位: radians, 范围：±PI; 注：本数据可作为如下 A664 输出数据的源; 1、MA64 航向/航迹角 FLOAT
    S32 ground_speed;                               //        ADSB,         交通地面速度, 单位: meters/second
    S32 dgs;                                        //        ADSB,         地速差, 单位: meters/second
                                                    /*
                                                    （对于空中交通，用ns_v和ew_v判定航迹角；对于地面交通，用航迹角或航向角，优先使用航向）
                                                        空中交通：基于NACv和地面速度判断的交通航迹角不确定度(95%)>±30度，航迹角无效
                                                        地面交通：基于NACv和地面速度判断的交通航迹角不确定度(95%)>±30度，航迹角无效
                                                        最低交通速度(节) | NACv
                                                                    20 | 0 or 1
                                                                    6 | 2
                                                                    2 | 3
                                                                    0.5 | 4
                                                    */
    U32 validity_flag_traffic_dir   :1;             //       /ADSB/,         交通方向有效性, 0: 无效; 1: 有效
    U32 vertical_sense              :2;             //       /ADSB/,         交通垂直感知, 0: descend(<-500fpm); 1:level; 2:climb(>500fpm)
    U32 tcas_tag                    :1;             //       /ADSB/,         TCAS相关标志, 0: 不相关; 1: 相关
    U32 traffic_qualified_for_vsa   :1;             //       /ADSB/,         交通VSA应用能力, 0: unqualified; 1: qualified
    U32 nacp                        :6;             //       /ADSB/,         位置导航完整性类别, 0:EPU ≥ 18.52 km (≥10 NM); 1：EPU < 18.52 km (10 NM); 2：EPU < 7.408 km (4 NM); 3：EPU < 3.704 km (2 NM); 4：EPU <：EPU < 1852 m (1 NM);5：EPU < 926 m (0.5 NM); 6：EPU < 555.6 m (0.3 NM); 7：EPU < 185.2 m (0.1 NM); 8：EPU < 92.6 m (0.05 NM)
    U32 nacv                        :6;             //       /ADSB/,         速度导航完整性类别, 0:未知或 > 10 m/s; 1：< 10 m/s; 2：< 3 m/s; 3：< 1 m/s; 4：< 0.3 m/s
    U32 selection_mark              :1;             //       /ADSB/TCAS,     被选中标志, 0:未被选中; 1:被选中，被选中状态下，交通 UA 应将该架飞机的Symbol画绿色表示
    U32 selection_vsa_mark          :1;             //       /ADSB/TCAS,     被选中为vsa领先飞机标志, 0:未被选中; 1：被选中，被选中状态下，交通 UA 应将该架飞机的Symbol画绿色表示
    U32 relative_alt_validity       :1;             //       /ADSB/TCAS,     相对高度有效性, 0:无效; 1:有效
    U32 bearing_validity            :1;             //       /ADSB/TCAS,     相对方位有效性, 0:无效; 1:有效
    U32 function_test_active        :1;             //       /ADSB/TCAS,     功能测试激活标志位, 0: 未激活; 1: 激活
    U32 vertical_speed_type         :1;             //       /ADSB/TCAS,     垂直速度类型, 0: 几何; 1: 气压
    U32 geo_vertical_speed_validity :1;             //       /ADSB/TCAS,     几何垂直速度有效性, 0:无效; 1:有效
    U32 baro_vertical_speed_validity:1;             //       /ADSB/TCAS,     气压垂直速度有效性, 0:无效; 1:有效
    U32 intruder_sensitivity_level  :7;             //       /ADSB/TCAS,     入侵机灵敏度等级, 具体枚举编码待后续定义

    F32 vertical_speed;                             //Ownship/ADSB/TCAS,     垂直速度, 单位: meters/second

    U32 ew_ns_velocity_validity     :1;             //       /ADSB,          东西南北速度有效性 20250414
    U32 P_1                         :31;             //预留位
} ASSAP_OUTPUT_FILE_ELEMENT;

//ASSAP_OUTPUT_FILE的大小为11760字节(8字节对齐)
typedef struct
{
    U32 FrameHeader;                                //0xAAAA0001
    01 00 aa aa
    U32 FrameNumber;                                //从 1 开始，每次递增 1
    18 1d 00 00
    U32 ownship_qualified_for_airb;                 //本机质量是否满足AIRB需求, 0: unqualified; 1: qualified
    01 00 00 00
    U32 ownship_qualified_for_vsa;                  //本机质量是否满足VSA需求, 0: unqualified; 1: qualified
    01 00 00 00
    U32 airb_status;                                //AIRB应用程序状态, 0: On; 1: Available to Run; 2: Unavailable to Run; 3: Unavailable - Fault; 4: Not Configured
    00 00 00 00
    U32 vsa_status;                                 //VSA应用程序状态, 0: On; 1: Available to Run; 2: Unavailable to Run; 3: Unavailable - Fault; 4: Not Configured
    00 00 00 00

                                                    /*
                                                    应用程序状态：
                                                    0 - On: Application is on/running; required ownship input data is available and meets the performance criteria.
                                                    1 - Available to Run: Application is configured. Required ownship input data is available and meets
                                                                        the performance criteria (This state represents that the
                                                                        ASA Application is manually or automatically selected off).
                                                    2 - Unavailable to Run: Required ownship input data is available but does not meet the
                                                                        performance criteria or is not available due to Non-Computed Data (NCD) conditions.
                                                    3 - Unavailable - Fault: Required ownship input data is not available due to a failure or the ASA Application process is failed.
                                                    4 - Not Configured: Application is not installed.
                                                    */

    U32 targets_num;                                //目标总数,代表“航迹信息”中的所有有效航迹数量,最大61（其中包含60个它机+1个本机）
    02 00 00 00
    U32 targets_num_only_tcas;                      //仅TCAS目标,代表“航迹信息”中的仅TCAS目标有效航迹数量,记为m,m最大为30
    00 00 00 00
    U32 targets_num_airborne;                       //空中目标数量,代表“航迹信息”中的空中目标有效航迹数量,记为x,x最大为30
    01 00 00 00 
    U32 targets_num_surface;                        //地面目标数量,U32代表“航迹信息”中的地面目标有效航迹数量，记为y,y最大为30。注：不包含仅TCAS目标，仅TCAS目标全部作为空中目标处理
    00 00 00 00
    ASSAP_OUTPUT_FILE_ELEMENT targets[MAX_ASSAP_OUTPUT_TGTS_NUM_WITHOUT_OWNSHIP + 1];   //1个本机 + 30个ADSB 空中 + 30个ADSB地面

    本机
    9a 99 99 99 99 45 87 40 00 00 00 00 01 00 00 00   .....E.@........   
    00 00 00 00 31 32 33 34 35 36 37 38 00 00 00 80   ....12345678....
    00 00 00 00 00 00 00 00 00 00 00 00 5d 7a e6 73   ............]z.s
    ce 58 e2 bf 84 28 c1 fd ae 0b fb 3f 34 33 33 33   .X...(.....?4333
    33 93 ac 40 00 00 00 00 00 00 00 00 00 00 00 00   3..@............
    44 9a cc 42 00 00 00 00 00 00 00 00 00 00 00 00   D..B............
    00 00 00 00 00 21 00 00 af d8 01 41 00 00 00 00

    目标1
    bintime
    9a 99 99 99
    99 45 87 40 
    num
    03 00 00 00 
    target_unique_id
    07 00 00 00
    type + tcas_alert_status
    01 00 00 00 
    flight_id  CAAC6681
    43 41 41 43 
    36 36 38 31 
    emitter_cat + emergency_priority_status + air_gnd_status
    06 00 00 80
    x
    f9 ff ff ff 
    y
    46 5d 00 00 
    z
    93 04 00 00 
    lat
    de 77 41 51   
    0b 3a e2 bf 
    lon
    62 42 13 7b 
    ad 0b fb 3f 
    alt
    cd cc cc cc   
    cc 0c b3 40 
    range
    63 5d 00 00 
    bearing
    6a 2c aa b9 
    relative_alt
    66 66 98 44   
    ns_v
    08 36 39 c3 
    ew_v
    d0 40 db 37 
    track_hdg_trk
    da 0f 49 40 
    ground_speed
    b9 00 00 00   
    dgs
    1f 01 00 00 
    flags
    0b 09 98 00 
    vertical_speed
    8f 8f a5 3e 
    ew_ns_velocity_validity + P1
    01 00 00 00

    //赵雨蒙添加元素
    OWNSHIP_STATUS_INFO ownship_status_infomation;  //本机状态信息
    // U32 Pad_3[8]                        ;        //预留位
    // U32 P                               ;        //ADS-B消息有效数量, 代表有效的 ADS-B 消息数量，P 最大为 80

    //傅钟添加以下的相关元素
    U32 ADSB_MSG_Validity_Num;                      //有效的ADS-B消息数量,最大为 200,数据用于支持 ADS-B IN 的测试
    FPGA_TO_ADSB_FILE_ELEMENT targets_adsbMsg[MAX_ADSB_MSG_NUM];//报文信息,该数据用于支持 ADS-B IN 的测试,由 IO 解析后通过调试口转发
    //U32 ADSB_Report_Validity_Num;                   //ADS-B 报告有效数量,最大有效数量为600，该数据用于支持 ADS-B IN 的测试
    //bufferElement data_report[600];                 //ADS-B 报告元素结构（联合体）
    U32 reserve[11];                                //预留位
    U32 crcCheck;                                   //CRC检测
    U32 FrameTail;                                  //0xBABA0001
} ASSAP_OUTPUT_FILE;

// 临时存储航迹，用于排序
typedef struct 
{
    ASSAP_OUTPUT_FILE_ELEMENT targets[160];     // 数组大小为160（100个ASSAP航迹和60个TCAS不相关航迹）
}TMP_ASSAP_OUTPUT_FILE;

#pragma pack()     //一字节对齐
#endif


定义如下目标符号及其ID：
ID Symbol
1 白色空心菱形（无方向）
2 白色实心菱形（无方向）
3 黄色实心圆形（无方向）
4 红色实心正方形（无方向）
5 黑色实心chevron
6 白色空心chevron
7 白色实心chevron

if (type == 4)
{
//纯TCAS
    if(tcas_alert_status == 0) //OT
    {
        绘制 ID 1
    }
    elseif (tcas_alert_status == 1) //PT
    {
        绘制 ID 2
    }
    elseif (tcas_alert_status == 2) //TA
    {
        绘制 ID 3
    }
    elseif (tcas_alert_status == 4) //RA
    {
        绘制 ID 4
    }
}
else if (type==1 || 2 || 3)
{
//纯ADS-B或TCAS与ADS-B混合
    if(tcas_alert_status == 0) //OT
    {
        if ( validity_flag_traffic_dir == 0)
        {
            if(tcas_tag == 0)
            {
                绘制ID1
            }
            else if(tcas_tag == 1)
            {
                绘制ID1;
                在symbol旁边加上TCAS字样，颜色cyan;
            }
        }
        else if ( validity_flag_traffic_dir == 1)
        {
            if(tcas_tag == 0)
            {
                绘制ID6,ID6方向旋转至track_hdg_trk
            }
            else if(tcas_tag == 1)
            {
                绘制ID6,ID6方向旋转至track_hdg_trk
                在symbol旁边加上TCAS字样，颜色cyan;
            }
        }
    }
    elseif (tcas_alert_status == 1) //PT
    {
        if ( validity_flag_traffic_dir == 0)
        {
            if(tcas_tag == 0)
            {
                绘制ID2
            }
            else if(tcas_tag == 1)
            {
                绘制ID2
                在symbol旁边加上TCAS字样，颜色cyan;
            }
        }
        else if ( validity_flag_traffic_dir == 1)
        {
            if(tcas_tag == 0)
            {
                绘制ID7,ID7方向旋转至track_hdg_trk
            }
            else if(tcas_tag == 1)
            {
                绘制ID7,ID7方向旋转至track_hdg_trk
                在symbol旁边加上TCAS字样，颜色cyan;
            }
        }
    }
    elseif (tcas_alert_status == 2) //TA
    {
        if ( validity_flag_traffic_dir == 0)
        {
            if(tcas_tag == 0)
            {
                绘制ID3
            }
            else if(tcas_tag == 1)
            {
                绘制ID3
                在symbol旁边加上TCAS字样，颜色cyan;
            }
        }
        else if ( validity_flag_traffic_dir == 1)
        {
            if(tcas_tag == 0)
            {
                //不存在
            }
            else if(tcas_tag == 1)
            {
                绘制ID3(下方)+ID5(上方),ID5方向旋转至track_hdg_trk
                在symbol旁边加上TCAS字样，颜色cyan;
            }
        }
    }
    elseif (tcas_alert_status == 4) //RA
    {
        if ( validity_flag_traffic_dir == 0)
        {
            if(tcas_tag == 0)
            {
                绘制ID4
            }
            else if(tcas_tag == 1)
            {
                绘制ID4
                在symbol旁边加上TCAS字样，颜色cyan;
            }
        }
        else if ( validity_flag_traffic_dir == 1)
        {
            if(tcas_tag == 0)
            {
                //不存在
            }
            else if(tcas_tag == 1)
            {
                绘制ID4(下方)+ID5(上方),ID5方向旋转至track_hdg_trk
                在symbol旁边加上TCAS字样，颜色cyan;
            }
        }
    }
}